#!/bin/bash
#.添加用户
#-uusername -ppassword
#
all(){
if [ ! -d "/home/ftpsite/$username" ]
then
mkdir /home/ftpsite/$username
chmod 777 /home/ftpsite/$username
else
echo "there must be someone already in"
continue
fi
cat << EOF > /etc/vsftpd/user.d/$username
write_enable=YES
anonymous_enable=NO
anon_world_readable_only=NO
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
local_umask=022
download_enable=YES
local_root=/home/ftpsite/$username
EOF
}
while getopts :u:p: opt
do
case $opt in
  u)username="$OPTARG"
  echo "$username">>/etc/vsftpd/mima.txt;;
  p)password="$OPTARG"
  echo "$password">>/etc/vsftpd/mima.txt
  db_load -T -t hash -f /etc/vsftpd/mima.txt /etc/vsftpd/vsftpd_login.db
  exit 1;;
esac
all
done
#if [ "$#" -eq 0 ]
#then
#1.安装vsftpd,pam,db4模块，注意pam必须事先安装
#
yum -y install vsftpd
yum -y install pam*
#rhel7中用libdb
yum -y install libdb
#  这里必须执行，不然没有/lib/security/下面的文件
#  同时注意这里系统版本，64位系统后续需指定/lib64/security
yum -y install pam_userdb.so
#
#设置umask为000，这样操作系统就不作读取、写入过滤
umask 000
#
#2.建立一个存放用户名和密码的文件
#
cat << EOF > /etc/vsftpd/mima.txt
sunrain990
123456
sunrain991
123456
sunrain992
123456
EOF
#
#3.生成虚拟用户账户数据库
#
#如果以后要更改mima.txt里的用户名的密码，重新执行上面命令才能生效
db_load -T -t hash -f /etc/vsftpd/mima.txt /etc/vsftpd/vsftpd_login.db
#
#4.更改使只有ROOT用户才能读写
#
chmod 600 /etc/vsftpd/vsftpd_login.db
#
#5.建立验证文件（自己命名，与后面配置指定的验证文件名一致）
#
#  输入文件内容：
#  这里需要注意64位系和32位系统/lib64/security/和/lib/security
#  也可以直接指定pam_userdb.so，默认路径
#
cat << EOF > /etc/pam.d/vsftpd_login
auth required pam_userdb.so db=/etc/vsftpd/vsftpd_login
account required pam_userdb.so db=/etc/vsftpd/vsftpd_login
EOF
#
#6.创建一个ftp_virt用户作为ftp用户，它的主目录为/home/ftpsite且不能登陆系统
#
useradd -d /home/ftpsite -s /sbin/nologin ftp_virt
#使所有的文件都能被访问，如果需要目录能访问，需要加-R
setfacl --set d:o:r-- /home/ftpsite
chmod 777 /home/ftpsite
mkdir /home/ftpsite/sunrain99{0,1,2}
#
#7.修改配置文件vsftpd.conf，添加以下内容
#
#  guest_enable=YES 启用虚拟用户
#  guest_username=ftp_virt 所有虚拟用户对应的系统用户为ftp_virt 
#  pam_service_name=vsftpd_login pam验证模块为/etc/pam.d/vsftpd_login
#  user_config_dir=/etc/vsftpd/user.d 虚拟用户配置的目录为user.d
#  allow_writeable_chroot=YES 允许更改虚拟用户根目录，可能writeable需要去掉e
#
echo -e "allow_writeable_chroot=YES\nguest_enable=YES\nguest_username=ftp_virt\npam_service_name=vsftpd_login\nuser_config_dir=/etc/vsftpd/user.d\npasv_enable=YES\npasv_min_port=10000\npasv_max_port=10100\npasv_promiscuous=YES" >> /etc/vsftpd/vsftpd.conf
#
#8.创建指定的虚拟用户配置文件夹
#
mkdir /etc/vsftpd/user.d
#
#9.配置内容：
#  建立的文件名需和mima.txt里面的文件名相同
#
#  用户名sunrain990，所有权限（上传、下载）
cat << EOF > /etc/vsftpd/user.d/sunrain990
write_enable=YES
anonymous_enable=NO
anon_world_readable_only=NO
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
local_umask=022
download_enable=YES
local_root=/home/ftpsite/sunrain990
EOF
#
#  用户名sunrain991，上传权限
cat << EOF > /etc/vsftpd/user.d/sunrain991
write_enable=YES
anonymous_enable=NO
anon_world_readable_only=NO
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
local_umask=022
download_enable=NO
local_root=/home/ftpsite/sunrain991
EOF
#
#  用户名sunrain992，下载权限
cat << EOF > /etc/vsftpd/user.d/sunrain992
write_enable=NO
anonymous_enable=NO
anon_world_readable_only=NO
anon_upload_enable=NO
anon_mkdir_write_enable=NO
anon_other_write_enable=NO
local_umask=022
download_enable=YES
local_root=/home/ftpsite/sunrain992
EOF
#
#10.常见错误：
#
#   1.如果报错500 OOPS: bad bool value in config file for: write_enable 
#   ----保证每一行最后没有任何空格，一般出错就是在多余的空格上
#   2.必须确保所有的目录都存在。
#   3.报错530，注意lib64是64位的目录的检查/lib/security/pam_userdb.so 存不存在，不存在yum install pam_userdb.so
#
#11.设置selinux
#
if [ `getenforce` = "Enforcing" ]
then
        echo "set for ftp selinux"
        for I in ftp_home_dir ftpd_anon_write ftpd_connect_all_unreserved ftpd_connect_db ftpd_full_access ftpd_use_cifs ftpd_use_fusefs ftpd_use_nfs ftpd_use_passive_mode httpd_can_connect_ftp httpd_enable_ftp_server
        do
        setsebool -P $I=1
        done
else
echo "selinux is not enforcing"
fi
firewall-cmd --permanent --add-port=21/tcp
firewall-cmd --permanent --add-port=10000-10100/tcp
firewall-cmd --reload
systemctl restart vsftpd
